#!/usr/bin/env bash
#set -e
# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
# [ 功能简述 ]:新建sftp服务和账户
# [ 适用平台 ]:适用于 RedHatEL7.X Centos7.X
# [ 当前版本 ]:1.01
# [ 最近修改 ]:2022-11-05
# [ 最近作者 ]:mugoLH
# [ 联系邮箱 ]:hxsaj@126.com
# [ 所属公司 ]:
# [ 脚本引用 ]:
# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----

# [ 脚本引用 ] Import the script
# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----

# [ 变量列表 ] List of common variables
# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
# SFTP路径
Sftp_Dir=/data/sftp
# 需要同步的目录
Mirr_Dir=download

# 获取本机IP
Ip=$(hostname -I | awk '{print$1}')


# [ 函数列表 ] Function list
# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
info_p(){  printf "\e[1;32;40m%-10s %-1s\n\e[0m" "${1}" "${2}"  >&1 ;}
tips_p(){  printf "\e[1;36;40m%-10s %-1s\n\e[0m" "${1}" "${2}"  >&1 ;}
error_p(){ printf "\e[1;35;40m%-10s %-1s\n\e[0m" "${1}" "${2}"  >&1 ;}

# 显示新建sftp账号信息
function Echo_Info(){
  tips_p "[ 时间 ]:" "$(date +%c)"
  info_p "[ 账户 ]:" "${FtpUser}"
  info_p "[ 密码 ]:" "${PassWd}"
  info_p "[ 数据 ]:" "${Sftp_Dir}/${FtpUser}/${Mirr_Dir}"
  info_p "[ 备查 ]:" "如果您忘记了账号密码，可查看 ~/.Secret.db 内容"
}

# 邮件发送账号信息
function Send_Mail_info(){
  Email_print(){
    info_p "[ SFTP主机 ]:" "${Ip}"
    info_p "[ SFTP账号 ]:" "${FtpUser}"
    info_p "[ SFTP密码 ]:" "${PassWd}"
    info_p "如密码有误或丢失，请联系管理员"
  }
  if [[ $(whereis mail | wc -l) -ge 1 ]];then
    echo -e "
    [ SFTP主机 ]: ${Ip}
    [ SFTP账号 ]: ${FtpUser}
    [ SFTP密码 ]: ${PassWd}
    如密码有误或丢失，请联系管理员
    " |mail -s "SFTP信息" "${MailUser[@]}"
  else
    error_p "[ ERROR   ]:" "系统未配置Mail发送客户端"
    exit 1
  fi
}
# 关闭selinux
function selinux_off() {
  if [ $(grep "^SELINUX=" /etc/sysconfig/selinux|awk -F "=" '{print$2}') != 'disabled' ];then
    sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux
    setenforce 0
  fi
}

# 新建用户
function create_sftp_user(){
  read -p "[ INPUT ] 输入新建sftp用户名 ：" FtpUser
  if [[ -z ${FtpUser} ]];then
    create_sftp_user
  elif [[ $(grep ${FtpUser} /etc/passwd|wc -l) -ge 1 ]]; then
    error_p "[ ERROR ]" "已存在 ${FtpUser} 账号 ，请重新输入"
    create_sftp_user
  else
    # 如果没有sftp组的话，建立sftp组
    [[ $(grep sftp /etc/group|wc -l) -ge 1 ]] || groupadd sftp
    # 创建用户
    useradd -g sftp -s /bin/false ${FtpUser}

    # 生成随机密码并保存到文件
    PassWd=$(strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 12 | tr -d "\n";echo)
    echo -e "${PassWd}"|passwd --stdin ${FtpUser} 2>&1 >/dev/null
    echo -e "${FtpUser} ${PassWd}" >> ~/.Secret.db

    # 建立SFTP目录
    if [ ! -d ${Sftp_Dir} ];then
      # 建立SFTP用户根目录
      mkdir -p ${Sftp_Dir} && chown -R root:root ${Sftp_Dir} && chmod 755 ${Sftp_Dir}
      # 建立SFTP用户登入后可写入的目标目录
      mkdir -p ${Sftp_Dir}/${FtpUser} && chown root:sftp ${Sftp_Dir}/${FtpUser}
      usermod -d ${Sftp_Dir}/${FtpUser} ${FtpUser}
      mkdir -p ${Sftp_Dir}/${FtpUser}/${Mirr_Dir} && chown -R ${FtpUser}:sftp ${Sftp_Dir}/${FtpUser}/${Mirr_Dir}
      chmod 755 ${Sftp_Dir}/${FtpUser}/${Mirr_Dir}
    fi

    # 修改/etc/ssh/sshd_config文件
    if [[ ! $(grep "^#Subsystem" /etc/ssh/sshd_config|wc -l) -ge 1 ]];then
      sed -i 's/^Subsystem/#Subsystem/g' /etc/ssh/sshd_config
      echo -e "\n\
Subsystem sftp internal-sftp -l INFO -f AUTH    #这行指定使用sftp服务使用系统自带的internal-sftp
Match Group sftp                                #这行用来匹配用户组
ChrootDirectory ${Sftp_Dir}/%u                  #用chroot将用户的根目录指定到/data/sftp ，这样用户就只能在/data/sftp下活动
AllowTcpForwarding no                           #这两行，如果不希望该用户能使用端口转发的话就加上，否则删掉
X11Forwarding no                                #这两行，如果不希望该用户能使用端口转发的话就加上，否则删掉
ForceCommand internal-sftp -l INFO -f AUTH      #指定sftp命令
" >> /etc/ssh/sshd_config
      # 重启sshd
      systemctl restart sshd.service
    fi

    # 关闭selinux
    selinux_off

    # 报告sftp部署结果
    echo -e "\n账户信息交付方式："
    echo -e "\
\033[1m\033[31m 1，\033[1m\033[33m邮件推送到目标邮箱并示在终端上 \033[0m
\033[1m\033[31m 2，\033[1m\033[33m仅显示在终端上 \033[0m
"
    read -p "请选择：" Deliver

    if [ ${Deliver} == '1' ];then
      read -p "接收信息的邮箱账号(如有多个账号请使用空格分开)：" -a MailUser
      Echo_Info &&Send_Mail_info
      echo -e "\n已将账户信息推送到以下邮箱：\n"
      for(( i=0;i<${#MailUser[@]};i++)) do echo -e "${MailUser[i]}"; done;
      echo -e""
    elif [ ${Deliver} == '2' ];then
      Echo_Info
    fi
  fi
}

create_sftp_user



